home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / UTILITY / MIDI8031 / LIESMICH.TXT < prev    next >
Encoding:
Text File  |  1987-04-21  |  51.6 KB  |  1,239 lines

  1. ------------------------------------------------------------------------
  2.  
  3.    ****************************************************************
  4.    * MIDI8031 Mikrocontroller-Entwicklungssystem für ATARI ST/STE *
  5.    ****************************************************************
  6.  
  7.    Autor:
  8.    Jürgen Piscol, Rastatterstr. 144, W-7500 Karlsruhe 51
  9.  
  10.    Tools:
  11.    Alle Programme von mir (JP) wurden mit LASER C entwickelt
  12.    (bis auf TESTRAM.PRG)
  13.  
  14.    WICHTIGER HINWEIS:
  15.    ==================
  16.    ALLE PROGRAMME DIESES ENTWICKLUNGSSYSTEMS SIND PUBLIC DOMAIN!
  17.    SIE DÜRFEN ABER NUR UNTER DER VORAUSSETZUNG KOPIERT WERDEN,
  18.    DASS KEIN TEIL DES ENTWICKLUNGSSYSTEMS VERÄNDERT WIRD! DIE
  19.    VORLIEGENDE SOFTWARE WURDE MIT GRÖSSTER SORGFALT ERSTELLT.
  20.    TROTZDEM LASSEN SICH FEHLER NICHT MIT SICHERHEIT AUSSCHLIESSEN.
  21.    DAHER KANN ICH KEIN HAFTUNG FÜR IRGENDWELCHE SCHÄDEN ÜBERNEHMEN,
  22.    DIE DURCH DEN GEBRAUCH DIESER SOFTWARE ODER HARDWARE ENTSTEHEN 
  23.    KÖNNTEN.
  24.  
  25. ------------------------------------------------------------------------
  26.  
  27.  
  28. Inhalt:
  29. =======
  30.  
  31. 1.) Vorwort, Übersicht
  32. 2.) Die Hardware MIDI8031
  33. 3.) Installation, Zusatzprogramme
  34. 4.) Shell (SHELL51.PRG)
  35. 5.) Assembler (A51.TTP)
  36. 6.) Disassembler (DIS51.TTP)
  37. 7.) Execute (EX51.TTP)
  38. 8.) Monitor/Source-Level-Debugger (MON51.TTP)
  39. 9.) Interrupts des MIDI8031
  40. 10.) Tips zur Fehlersuche
  41. 11.) Die Demoprogramme
  42. 12.) Sprachsynthese mit SMSSEDIT.PRG
  43. 13.) Zusatzhardware, MIDI8031-Powerport
  44. 14.) Stromsparmechanismen des 80C31
  45. 15.) Fileformate
  46. 16.) Programme ins EPROM brennen, das OS-EPROM, EPROM Service
  47. 17.) Literatur zum Thema
  48.  
  49.  
  50. 1.) Vorwort, Übersicht
  51. ======================
  52.  
  53. Ein Entwicklungssystem für Mikrocontroller gab es bis jetzt meines
  54. Wissens nach für ATARI Computer noch nicht. Aus aktuellem Anlass
  55. habe ich die vorliegende Software/Hardware entwickelt:
  56. Sie bezieht sich auf das Mikrocontrollerprojekt in der 
  57.  
  58. ***************************************************
  59. * Zeitschrift ST-Computer, Ausgaben Mai-Juli 1992 *
  60. ***************************************************
  61.  
  62. In diesen Ausgaben finden sie auch die Grafiken und Baupläne 
  63. zur Hardware! Schreibfehler und andere kleinere Unzulänglichkeiten
  64. in diesem Text bitte ich zu entschuldigen. Ich bitte sie, aus 
  65. diesen Fehlerchen auch keine Rückschlüsse auf die Qualität der
  66. Software zu ziehen: Die Software wurde von mir sehr sorgfältig
  67. entwickelt, da ich sie vor allem auch für den eigenen Gebrauch
  68. konzipiert habe. Soft- und Hardware wurden monatelang intensiv
  69. ausgetestet, bevor ich mich dazu entschloss sie der Allgemeinheit
  70. ( = Public Domain) zugänglich zu machen!
  71.  
  72. Mikrocontroller? What's this?
  73. -----------------------------
  74.  
  75. Was ein Mikroprozessor ist, weiss inzwischen ja wohl jeder. Dagegen ist
  76. der Begriff Mikrocontroller den meisten weniger geläufig. Der Grund:
  77. Mikrocontroller sind 'Heinzelmännchen'; sie arbeiten fast immer im
  78. Verborgenen: in Videorecordern, Waschmaschinen, Aufzügen, in Spielzeug, 
  79. Alarmanlagen und sogar in Bohrmaschinen! Mit Sicherheit gibt es 
  80. heutzutage bedeutend  mehr Mikrocontroller auf der Welt als "reine"
  81. Mikroprozessoren. Was aber ist der Unterschied: Zum Aufbau eines 
  82. "klassischen" Computersystems werden  mindestens die folgenden 
  83. Komponenten benötigt:
  84.  
  85.      Mikroprozessor                       \
  86.      Schnittstellen                         \
  87.      Etwas RAM                                =  Mikrocontroller 
  88.      ROM oder EPROM als Programmspeicher    /
  89.      Taktgenerator                        /
  90.  
  91. Ein Mikrocontroller ist die Summe dieser 5 Teile in einem einzigen IC.
  92. Daher werden Mikrocontroller oft auch als Ein-Chip-Computer bezeichnet,
  93. was den Sachverhalt sehr genau beschreibt: Die gesamte Peripherie eines
  94. Mikrocontrollers besteht im Minimalfall aus einer Batterie und einem
  95. Quarz.
  96.  
  97. Durch den massenhaften industriellen Einsatz ist der Preis für
  98. Mikrocontroller ziemlich niedrig: Einfache Typen sind bereits für 
  99. weniger als 5.-- DM zu erhalten!
  100.  
  101. Für den Amateur sind Mikrocontroller prinzipiell nicht weniger 
  102. interessant als für die Industrie: Die Wahrscheinlichkeit, dass eine
  103. selbstgebastelte Schaltung funktioniert, sinkt eben mit der Anzahl
  104. der Bauteile.
  105.  
  106. Es gibt eigentlich nur ein Haupthindernis: Ein Entwicklungssystem für 
  107. Mikrocontroller kostete bis heute mindestens 1000 DM, davon abgesehen, 
  108. dass es sowas für ATARIs bis jetzt überhaupt nicht gab.
  109.  
  110. Doch jetzt, brandneu, gibt es MIDI8031, ein komplettes Entwicklungs-
  111. system für die industriell am häufigsten verbreitete Mikrocontroller-
  112. Familie: Die "80x1x"-er . Und es kostet keine 1000 DM, keine 500 DM, 
  113. und auch nicht 100 DM, nein: es ist UMSONST, Public Domain!
  114. Sie benötigen lediglich die Hardware, die sie als kompletten Bausatz
  115. preiswert selbst herstellen können.
  116.  
  117.       !   Speicher auf dem Chip !
  118. Name  !   ROM/EPROM   !   RAM   !   Besonderheiten
  119. ------+---------------+---------+-------------------
  120. 8051      4kB ROM         128B
  121. 8751      4kB EPROM       128B
  122. 8031      keines          128B
  123. 8052      8kB ROM         256B
  124. 87C71     4kB EPROM       128B  /  Das 'C' bedeuted CMOS =
  125. 80C31     keines          128B  \  niedrigen Stromverbrauch
  126. 80C515    8kB ROM         256B  /  8 AD-Wandler sind mit auf dem
  127. 80C535    keines          256B  \  auf dem Chip!
  128. ...       ...             ... 
  129. Die "80x1x"-Mikrocontroller-Familie umfasst einige Dutzend
  130. Mitglieder.
  131.  
  132.  
  133. Einige der "80x1x" besitzen keinen Programmspeicher auf dem Chip
  134. (wie etwa der 8031). Diese sind dann keine echten Ein-Chip-Computer,
  135. da sie zusätzlich ein ROM oder EPROM benötigen. Manche der Typen
  136. sind für Amateure ungeeignet (zum Beispiel der 8051): Ein ROM kann 
  137. nur bei der Herstellung des Chips programmiert werden, soetwas lohnt
  138. sich erst bei hohen Stückzahlen. Typen mit EPROM (8751,87C51, ...) 
  139. lassen sich mit etlichen handelsüblichen EPROM-Programmiergeräten 
  140. programmieren. Das 'C' im Namen mancher Typen (etwa 80C31) bedeutet, 
  141. dass es sich um einen  CMOS-Typ handelt. CMOS-Typen brauchen nur sehr 
  142. wenig Strom. Die Verwandschaft der Familie liegt an zwei Dingen: 
  143. Zum einen besitzen  alle eine minimale gemeinsame Anzahl von Ports, 
  144. Timern und RAM, zum anderen sind die CPUs aller Typen identisch! 
  145. Das heisst: Der Befehlssatz der CPUs ist 100% identisch. Der Befehls-
  146. satz an sich ist sehr einfach zu erlernen. Einige Literaturhinweise
  147. zu Büchern, die den Befehlssatz beschreiben finden sie in Kapitel 17. 
  148. Obwohl er an sich recht einfach ist, ist er trotzdem auch effizient, 
  149. und vor allem schnell: Für eine 8*8-Bit Multiplikation oder eine 
  150. 16/8-Bit Divison  benötigten selbst die Langsamsten der Familie nur 
  151. 4 Mikrosekunden! Alle "80x1x" sind somit Software-aufwärtskompatibel 
  152. zum 8031. Die zusätzlichen Funktionen der grösseren  Geschwister des 
  153. 8031 (sie haben mehr Ports, mehr RAM, ROM oder EPROM, Timer; sie 
  154. sind schneller; ...) lassen sich durch ein schlaues Softwarekonzept 
  155. ohne Änderungen mit einem Standard-8031-Assembler nutzen. Doch davon 
  156. später mehr.
  157.  
  158. Das Entwicklungssystem
  159. ----------------------
  160.  
  161. Das Entwicklungssystem MIDI8031 besteht aus 2 Komponenten: Soft-
  162. und Hardware. Die Software selbst ist sehr umfangreich, aber,
  163. wie bereits erwähnt, völlig Public Domain! Hier eine kurze
  164. Übersicht:
  165.  
  166.      Software:
  167.           80x1x-Crossassembler, für die ganze "Familie"
  168.           Source-Level-Debugger (!!! Ein echter Leckerbissen !!!)
  169.           Monitorprogramm
  170.           80x1x-Disassembler
  171.           GEM-Editor 
  172.           Demo-Programmen (sogar ein Sprachsynthesizer ist dabei)
  173.           Shell
  174.           ausführliche Anleitung: Sie lesen sie gerade
  175.  
  176. Die MIDI8031-Hardware besteht aus einem Mikrocontroller 80C31
  177. einem EPROM (das ein kleines "Betriebssystemchen") enthält, einer 
  178. MIDI-Schnittstelle, und einem 32kB-RAM. MIDI8031 ist ein 
  179. kompletter Mikrocomputer! Einige Daten:
  180.  
  181.       Hardware (Name: "MIDI8031")
  182.           80C31-8-Bit CMOS-Mikrocontroller: 
  183.                - Softwarekompatibel zum 8031
  184.                - getaktet mit 12 MHz
  185.                - 16 bidirektionale I/O-Pins
  186.                - 128 Bytes On-Chip-RAM
  187.           32kB RAM
  188.           max. 32kB EPROM
  189.           MIDI-Schnittstelle
  190.  
  191. Der Entwicklungsablauf ist folgendermassen: Das 8031-Programm wird auf 
  192. einem ATARI geschrieben. Per 'Tastendruck' wird es über MIDI in das
  193. RAM des MIDI8031 transferiert, wo es getestet werden kann. Läuft es
  194. korrekt, bestehen 3 Möglichkeiten: 
  195.  
  196. 1.) Sie brennen das Programm in ein EPROM und ersetzen das Original-EPROM
  197.   des MIDI8031 durch Ihr eigenes. 
  198. 2.) Oder aber, sie verwenden ihr EPROM für eine komplette 
  199.   Eigenentwicklung. 
  200. 3.) Als dritte Alternative kann das Programm in einen Mikrocontroller 
  201.   mit eingebautem EPROM gebrannt werden, womit sie sich ihren 
  202.   persönlichen Ein-Chip-Computer verwirklicht hätten, sofern ihr
  203.   Programm in das EPROM des entsprechenden Chips passt.
  204.  
  205. Besonders durch die eingebaute MIDI-Schnittstelle steht Ihnen mit der
  206. MIDI8031-Hardware aber auch die Welt der Musik offen!
  207.  
  208.  
  209. 2.) Die Hardware MIDI8031
  210. =========================
  211.  
  212. Die Hardware wurde möglichst einfach gehalten, sie besteht nur aus
  213. wenigen Bauteilen, im wesentlichen:
  214.  
  215. - 80C31-Mikrocontroller
  216. - EPROM wahlweise 32kB- oder 8kB-Typ (enthält das "Betriebs-
  217.   systemchen")
  218. - RAM 32kB (CMOS-Ausführung)
  219. - Optokoppler zur Steuerung der MIDI-Schnittstelle
  220. - 2 MIDI-Buchsen (IN/OUT)
  221. - Softwaregesteuerte LED
  222. - Spannungsstabilisierung 9-20 Volt auf 5 Volt
  223. - Reset-Taste
  224. - Einige Gatter: Normalerweise kann der 8031 keine Programme im
  225.   RAM ausführen. Mit einem Extra-Gatter geht das aber trotzdem.
  226. - 20 Polige Buchsenleiste an der die 16 Ports, etc. anliegen.
  227.  
  228. Den Schaltplan finden Sie in den oben genannten Zeitschriften,
  229. oder aber:
  230.  
  231. Service
  232. -------
  233.  
  234. Nicht jeder hat zuhause eine "Ätzküche" für die Platinenher-
  235. stellung. Daher können Sie folgendes Angebot wahrnehmen: Der 
  236. komplette Bausatz MIDI8031 mit einer hochwertigen Platine 
  237. (Epoxydharz, verzinnt, mit Bestückungsaufdruck), sämtlichen 
  238. Bauteilen (incl. 6 Sockel für die ICs), dem gebrannten Entwicklungs-
  239. system-EPROM, einer ausführlichen Aufbauanleitung und einer Diskette 
  240. mit dem vollständigen Public-Domain-Entwicklungs-system für alle 
  241. ATARI ST/STE ab 512 kB, können Sie für DM 89.-- (Nachnahme) unter 
  242. dieser Adresse bestellen:
  243.  
  244. Jürgen Piscol
  245. Rastatter Str. 144
  246. W-7500 Karlsruhe 51
  247.  
  248.  
  249. 3.) Installation, Zusatzprogramme
  250. =================================
  251.  
  252. Dieses Entwicklungssystem arbeitet Dateiorientiert, das heisst
  253. der Informationsaustausch zwischen den einzelnen Programmen
  254. erfolgt über Dateien. Die Software läuft zwar auch von Floppy-Disk,
  255. aber eben nur recht langsam. Auch wenn sie eine Festplatte
  256. besitzen, empfehle ich ihnen die Verwendung einer RAM-Disk.
  257. Nicht alle Programme des Entwicklungssystems stammen von mir:
  258. Den Editor und die RAM-Disk habe ich anderen Public-Domain-
  259. Disketten entnommen. Sie sind unverändert, die Anleitungen dazu
  260. sind separat in den Dateien: VDISK35.DOC, EDITOR.DOC (Textdateien).
  261. Falls sie eine Festplatte besitzen: Kopieren sie zur Installation 
  262. den ganzen Ordner MIDI8031 darauf, bei Bedarf kopieren sie die RAM-
  263. Disk VDISK.ACC ins Bootlaufwerk. Falls sie keine Festplatte
  264. besitzen: Fertigen Sie sich eine Kopie dieser Disk an und kopieren
  265. sie die RAM-Disk VDISK.ACC ins Wurzelverzeichnis. Die RAM-Disk
  266. belegt nach dem Booten nur einen Eintrag in der Menueleiste, jedoch
  267. noch keinen RAM-Speicher! Um mit MIDI8031 zu arbeiten melden sie
  268. die RAM-Disk mit einer entsprechenden Gröβe an (bei 1 MB RAM z. Bsp.
  269. mit 500kB) und kopieren Sie die gewünschten Dateien des Entwicklungs-
  270. systems (oder gleich den ganzen Ordner MIDI8031) hinein, nun kann es
  271. losgehen ... Beachten sie, daβ die RAM-Disk reset-fest ist!
  272. Zum Anschluss von MIDI8031 an ihren ATARI benötigen sie 2 Stereo-
  273. Überspielkabel von etwa 1-2 Meter Länge. Falls sie sich über die
  274. Eignung der Kabel nicht ganz sicher sind, finden sie dazu auch einen
  275. Hinweis im Kapitel 7.
  276.  
  277. Booten von dieser Disk
  278. ----------------------
  279.  
  280. Damit sie sofort loslegen können, habe ich
  281. auf dieser Disk bereits einige Voreinstellungen getroffen:
  282.  
  283. - Booten sie ihren Rechner (sofern er mind. 1 MB RAM besitzt) von
  284.   dieser Disk.
  285. - Auf Ihrem Desktop finden sie rechts oben ein RAM-Disk Zeichen.
  286. - Gehen sie auf den Menuepunkt "Ramdisk". Die RAM-Disk bietet 
  287.   ihnen nun die Grösse 512kB an. Klicken sie auf "ANMELDEN".
  288. - Kopieren sie nun den kompletten Ordner MIDI8031 auf die
  289.   RAM-Disk.
  290. - Klicken sie doppelt auf eine beliebige "*.S51"-Datei um die
  291.   Shell aufzurufen.
  292.  
  293.  
  294. 4.) Shell (SHELL51.PRG)
  295. =======================
  296.  
  297. Die meisten Programme des Entwicklungssystems werden über
  298. Kommandozeilen gesteuert. Um Ihnen dazu die Arbeit etwas zu
  299. vereinfachen, existiert die Shell (SHELL51.PRG):
  300. Per Tastendruck wird das Programm assembliert, gestartet,
  301. editiert, gelistet, ...
  302. Die Shell ist mässig intelligent: Sie versucht sich zu merken,
  303. ob z. Bsp. Assemblierung wirklich notwendig ist. Kommandos:
  304.  
  305. 'e': Aufruf des Editors und Übergabe der Projekt-Sourcedatei an ihn.
  306. 'x': Wenn nötig wird das Projekt assembliert und gestartet.
  307.      Das Programm läuft dann auf MIDI8031, bis sie auf MIDI8031
  308.      Reset drücken.
  309. 'm': Wie 'x'. Das Projekt wird aber nicht gestartet, sondern an
  310.      den MIDI8031-Monitor übergeben (Debugging).
  311. 'd': Wie 'm', zusätzlich erzeugt die Shell aber eine Source-Level-
  312.      Debugger-Datei.
  313. 'p': Um den Assemblervorgang zu kontrollieren, kann hier eine
  314.      Liste erzeugt werden: LISTE.LST
  315. 'n': Manuelle Eingabe des Projektnamens (Immer ohne Extender)!
  316.  
  317. Hinweis: Wenn sie SHELL51 als GEM-Anwendung anmelden, auf die
  318.          Extender 'S51', und dann das Desktop sichern (Arbeit sichern),
  319.          reicht es, wenn Sie in Zukunft auf das jeweilige Projekt
  320.          klicken, den Namen trägt dann die Shell selbst ein.
  321.  
  322.  
  323. 5.) Assembler (A51.TTP)
  324. =======================
  325.  
  326. Konvention: 8051-Sourcedateien enden mit ".S51". Dateien mit
  327. Programmcode für MIDI8031 enden mit ".O51". Diese Dateien werden
  328. im folgenden auch als Objektdateien bezeichnet.
  329.  
  330. Der Assembler kann prinzipiell Code für alle 51-er erzeugen. Die
  331. Definition der Spezialfunktionen der einzelnen Typen befindet
  332. sich in der Datei reg51.inc für 80(C)31,80(C)51,87(C)51. Wenn Sie
  333. Programme für andere Typen schreiben wollen, wenden Sie sich bitte
  334. an mich.
  335.  
  336. Im Wesentlichen unterscheidet sich der Assembler nicht von anderen.
  337. Falls was unklar sein sollte: Lassen Sie sich die Demos ausdrucken.
  338.  
  339. Bedienung
  340. ---------
  341.  
  342. Kommentarzeilen beginnen immer mit einem Semikolon.
  343. Symbolnamen dürfen maximal 8 Zeichen lang sein. Gross-/Klein-Schreibung
  344. wird ignoriert, Umlaute ('AÖÜ') und 'ß' dürfen nicht verwendet werden!
  345. Das Rechnen mit Symbolnamen ist jederzeit möglich. Ausdrücke wie
  346. z. Bsp. "100-(('a'/$16)+symbol-num*4)" sind erlaubt.
  347.  
  348. Zahlenwerte:
  349. ------------
  350.  
  351.    [Dezimalzahl]       Byte kann sein: -256..255
  352.                        Wort: -32768..65535
  353.    '[ASCII]'           Bsp.: '@' hat den Wert 64
  354.    $[Hexzahl]          Bsp.: $FFFF hat den Wert 65535
  355.    %[Binaerzahl]       Bsp.: %11111110 hat den Wert 254
  356.    [Symbolname]        Es wird der Name des Symbols verwendet.
  357.    !                   Wert des PCs bei Zeilenanfang: Bsp.
  358.                            mov R0,#10       =      mov R0,#10
  359.                            djnz R0,!        =   w: djnz R0,w
  360.                        spart ein Label!
  361.  
  362. Symbole:
  363. --------
  364.  
  365. Symbole (auch 'Label' genannt) mit Doppelpunkt am Ende, werden als 
  366. Adressdefinitionen behandelt. Doppelte Definitionen von Adressen 
  367. sind verboten! Symbole mit '=' am Ende werden als Variable behandelt.
  368. Bei Variablendefinitionen sind mehrfache Zuweisungen erlaubt, jeweils 
  369. die letzte gilt: Bsp:     
  370.  
  371.          nr = 11
  372.          mov A,#nr  ; ACC mit 11 laden
  373.          nr = 21
  374.          mov A,#nr  ; ACC mit 21 laden
  375.  
  376. Symbole, die mit '?' beginnen, werden als 'versteckt' gekennzeichnet.
  377. Sie tauchen in der Symbolliste nicht auf. Sinnvoll z. Bsp. bei sehr
  378. kurzen Sprüngen. Symbolnamen dürfen keine deutschen Umlaute enthalten 
  379. (Bsp.: 'fünf') und auch kein 'ß'.
  380.  
  381. Operatoren:
  382. -----------
  383.  
  384. Es gilt natürlich "Punkt vor Strich". Da der Assembler aber
  385. noch mehr sogenannte 'Operatoren' kennt als nur Plus, Minus,
  386. Multiplikation und Division, dient die folgende Liste als
  387. Übersicht: 
  388.  
  389. Hierarchie und Art der möglichen Operatoren:
  390.  
  391. Priorität: Hoch
  392.  ( )             Normale Klammer
  393.  .               Bitadressen Bsp. ACC.7: Bit 7 von ACC
  394.  * /
  395.  + -
  396.  &               Logisches Und (Bsp: %110 & %010 = %010)
  397.  |               Logisches Oder (%110 | %011 = %111)
  398.  ^               Logisches Exlusiv-Oder (%110 ^ %011 = %101)
  399. Priorität: Nieder
  400.  
  401.  
  402. Direktiven
  403. ----------
  404.  
  405. .registers [Datei] wählt die Definition der Register für
  406.                    Spezialfunktionen, hier nur beigelegt reg51.inc:
  407.                    Für die Typen: 80(C)31,80(C)51,87(C)51
  408.  
  409. .text_org [Zahlenwert] Adresse des 1. Codebytes. Nur einmal pro
  410.                    Sourcefile erlaubt. Für Programme, die im RAM des
  411.                    MIDI8031 getestet werden sollen, muss der Zahlenwert
  412.                    grösser als $8000 sein, da nur dieser Bereich RAM ist.
  413.                    Das RAM in MIDI8031 beträgt 32kB ab dieser Adresse.
  414.  
  415. .var_org [Zahlenwert] Öffnet ein (uninitialisiertes) Variablen-Segment. 
  416.                    in Variablensegmenten sind keine Definitionen er-
  417.                    laubt, nur Reservierungen (.ds.b und .ds.w, siehe
  418.                    nachfolgend). Es sind beliebig viele .var_org pro
  419.                    Sourcedatei möglich. Diese Direktive ist hilfreich 
  420.                    beim Aufbau von Variablenfeldern im internen oder 
  421.                    externen RAM des 8031.
  422.  
  423. .ds.w, ds.b        Reserviert Speicher (Wort/Byte), .w: 2 Bytes pro 
  424.                    Wort. Bsp.:
  425.                           test:  .ds.w 50   
  426.                    reserviert für 'test' 100 Bytes (die es im Text-
  427.                    segment mit dem Wert 0 initialisiert)
  428.  
  429. .dc.b              Definiert ein Byte, oder einen String, d.h. der
  430.                    Speicher wird an dieser Stelle initialisiert. Bsp.:
  431.                           .dc.b "HALLO!",0
  432.                    Wichtig: Strings werden nicht automatisch beendet,
  433.                    daher hier die Null.
  434.  
  435. .dc.w              Schreibt Worte im Intel-Format: Zuerst Low-, dann
  436.                    Highbyte. Bsp.:
  437.                           .dc.w go,hello,$8000,%11111111000
  438.  
  439. .ibytes [Datei]    Fügt an dieser Stelle eine Datei ein. Verwendung
  440.                    Beispielsweise in der Demo PHONEM
  441.  
  442. .hide              Versteckt den nachfolgenden Teil des Listing, z. Bsp.
  443.                    beim Source-Level-Debugging, bis zu einem .show:
  444.  
  445. .show              Hebt .hide wieder auf. Bsp.:
  446.                           test:
  447.                               .hide
  448.                               .ibytes lange_da.tei
  449.                               .show
  450.                    Verhindert, dass in Listings des Assemblers alle
  451.                    Bytes der langen Datei einzeln erscheinen.
  452.  
  453. .nlist             Bei Ausgabe eines Assemblerlistings (z. Bsp.
  454.                    die Funktion 'p' in der Shell) wird ab hier 
  455.                    die Ausgabe unterdrückt.
  456.  
  457. .list              hebt .nlist wieder auf, nicht aber .show
  458.  
  459. Der Unterschied zwischen .hide/.show und .nlist/.list ist der, dass
  460. .hide/.show eine Ebene tiefer ist als .nlist/.list, Bsp.:
  461.  
  462.       Sourcefile       Assembler-Listing         Debugger
  463. ------------------------------------------------------------------
  464.        .hide                 .hide                 .hide
  465.        .dc.w $1234
  466.        .show
  467.        .dc.w $2345     45 23 .dc.w $2345     45 23 .dc.w $2345 
  468.        .nlist                                      .nlist
  469.        .hide                                       .hide
  470.        .dc.w $1234                                 
  471.        .show
  472.        .dc.w $2345                           45 23 .dc.w $2345
  473.        .list                                       .list
  474.  
  475.  
  476. Variablenzugriffe
  477. -----------------
  478.  
  479. Will der 8031 einen Befehlscode holen oder Daten aus dem
  480. Programmspeicher (Tabellen, Konstanten), so gibt der die
  481. Adresse aus und setzt danach das Signal PSEN- auf LOW.
  482. Bei Lesezugriffen auf den RAM-Speicher wird nach der
  483. Adressausgabe das Signal RD- auf LOW gesetzt, bei
  484. Schreibzugriffen das Signal WR-. Normalerweise würden
  485. also bei gleicher Adresse verschiedene Speicherbausteine
  486. angesprochen! 
  487.  
  488. Leider gibt es normalerweise keine Möglichkeit Programme im 
  489. RAM eines 8031-Systems ablaufen zu lassen. Durch den Schaltungs-
  490. kniff mit dem NAND-Gatter 74HCT00 werden beide Adressräume
  491. bei Zugriffen auf Adressen oberhalb von $8000 vereinigt. 
  492.  
  493. Hinweis zum "Linken"
  494. --------------------
  495.  
  496. Der Assembler in der vorliegenden Version 2.x ist nicht in der
  497. Lage Programmteile zu linken. Bedeutung des Befgriffs "linken":
  498. Normalerweise bestehen grössere Programme immer aus mehreren
  499. kleineren Modulen, die getrennt editiert und assembliert werden.
  500. Beim "linken" werden diese kleinerern Module zu einem funktions-
  501. fähigen Programm zusammengesetzt. Ein "Linker" ist zwar in diesem
  502. Paket nicht enthalten, trotzdem ist mit MIDI8031 die Entwicklung
  503. mehrteiliger Programme möglich: Solange MIDI8031 mit Strom versorgt
  504. wird, bleiben Daten im RAM-Speicher erhalten. Auch bei Drücken der
  505. Reset-Taste! Zusätzlich ist es mit der Assembler-Direktive 
  506. ".text_org" möglich, Code an beliebige Adressen im RAM zu laden.
  507. Mein Vorschlag wäre: Verteilen sie ihr Programm in mehrer Blöcke,
  508. die jeweils bei markanten Adressen beginnen (etwa bei $8000,
  509. $9000, $A000 ...). Zwischen den einzelnen Blöcken liegt dann zwar
  510. jede Menge unbenutzter Speicher, aber das ist ja in der Entwicklungs-
  511. phase nicht ausschlaggebend. Wenn das Programm später ordnungsgemäss
  512. arbeitet, können die Lücken immer noch zusammengeschoben werden.
  513. Jedes der Module beginnt mit einer Liste von Sprüngen, zu den vom
  514. Modul angebotenen Funktionen. Der erste Sprung geht jeweils 
  515. entweder zu einer Endlosschleife oder zum Hauptprogramm. Jedenfalls
  516. darf der 8031 nie ins "Leere" springen, da sonst Daten zerstört
  517. werden könnten. Sie können nun an jeweils einem der Module 
  518. arbeiten. Ein Beispiel:
  519.  
  520. --------------------------------------------------------------
  521. ;* Datei 1, Hauptprogramm:
  522.  
  523.          .registers reg51.inc
  524. datei1 = $8000           ; Hier beginnen die Module
  525. datei2 = $9000
  526.  
  527.          .var_org datei2 ; Funktionen im Unterprogrammmodul
  528.          .ds.b 3         ; Einsprungroutine
  529. led_on:  .ds.b 3         ; ljmp belegt 3 Bytes 
  530. led_off: .ds.b 3
  531.  
  532.        .text_org datei1  ; Modul beginnt bei $8000
  533. stop:  ljmp stop         ; Endlosschleife oder ljmp go
  534. go:    mov SP,#$30       ; Stack fuer lcall setzen
  535.        lcall led_on      ; Fremdes Unterprogramm aufrufen
  536.        lcall wait
  537.        lcall led_off
  538.        lcall wait
  539.        sjmp go
  540.  
  541. ; * Unterprogramm: Wartet etwa 0.2 sec.
  542. wait:  mov R0,#0
  543.        mov R1,#1
  544. ?w0:   djnz R0,?w0
  545.        djnz R1,?w0
  546.        ret
  547.  
  548. --------------------------------------------------------------     
  549. ; *Datei 1, Unterprogramme:
  550.  
  551.          .registers reg51.inc
  552. datei1 = $8000
  553. datei2 = $9000
  554.  
  555.        .text_org datei2
  556. stop:  ljmp datei1+3       ; Sprung ins Hauptprogramm oder stop
  557. led_on: ljmp ?lonn
  558. led_off: ljmp ?loff
  559.  
  560. ?lon:  setb P3.5           ; MIDI8031 LED an
  561.        ret
  562. ?loff: clr P3.5            ; aus
  563.        ret
  564. --------------------------------------------------------------
  565.  
  566. Angenommen, sie möchten an den Unterprogrammen arbeiten:
  567. Editieren sie Datei1, setzen sie den ersten ljmp als
  568. Endlosschleife und starten sie datei1 auf MIDI8031.
  569. Wählen sie nun den neuen Projektnamen datei2, sorgen sie dafür,
  570. dass der erste ljmp das Hauptprogramm aufruft....
  571. Natürlich ist diese Methode zur Entwicklung mehrteiliger
  572. Programme schon etwas aufwendiger. Vor allen Dingen kann man
  573. nicht mehr einfach schnell mal so "drauflosprogrammieren",
  574. da hier schon ein gewisses Mass an Programmierdisziplin
  575. nötig wird. Aber mit etwas Konsequenz können sie mit dieser
  576. Methode Programme beliebiger Länge entwickeln. 
  577.  
  578. Vorschau
  579. --------
  580.  
  581. Der Assembler ist im Moment noch nicht besonders schnell. Für die
  582. Zukunft habe ich folgende Erweiterungen geplant:
  583. 1.) Umstellung auf Tokenisierende Assemblierung (Faktor 100 schneller)
  584. 2.) Makros
  585. 3.) Bedingte Assemblierung
  586. 4.) Linkfähige Objektdateien
  587.  
  588.  
  589. 6.) Disassembler (DIS51.TTP)
  590. ============================
  591.  
  592. Der Disassembler kann O51-Dateien wieder in disassemblieren (was sonst).
  593. Parameter der Kommandozeile:
  594. 1.) Name O51-Datei ohne Extender
  595. 2.) '>'+Ausgabedatei (vollständiger Name)
  596.  
  597. Diese Kommandozeile disassembliert die Datei TEST.O51 in 
  598. die Datei LIST.LST:     
  599.  
  600.          TEST >LIST.LST
  601.  
  602.  
  603. 7.) Execute (EX51.TTP)
  604. ======================
  605.  
  606. Um vorhandene O51-Dateien an MIDI8031 zu senden und sofort zu
  607. starten dient dieses Programm. Es kann mit der TOS-Funktion
  608. Pexec() auch von anderen Programmen aufgerufen werden.
  609. Wichtig: Bei Pexec muss das 1. Byte der Kommandozeile ihre
  610. Länge enthalten (Pascal-Format). Parameter ist der Name der
  611. zu startenden O51-Datei ohne den Extender .O51.
  612. Es ist zu empfehlen, vor Aufruf von EX51.TTP MIDI8031 zu resetten,
  613. falls das momentan laufende Programm Interrupts verwendet.
  614.  
  615. Datensicherheit, MIDI-Kabel
  616. ---------------------------
  617.  
  618. Die Datenübertragung über MIDI ist sehr zuverlässig, solange
  619. sie (abgeschirmte) MIDI-Kabel verwenden, deren Länge 2 Meter
  620. nicht übersteigt. Eine Fehlererkennung bei der Datenübertragung
  621. wurde deshalb nicht vorgesehen. Das Programm TESTRAM.PRG dieser
  622. Disk dient zum Test der Datenübertragung und des MIDI8031 RAMs.
  623. Bei MIDI werden die Daten mit einer Rate von 31500 Baud übertragen.
  624. Das sind maximal etwa 3 Kilobyte pro Sekunde! Zusätzlich wurde
  625. MIDI eigentlich als Schnittstelle zwischen Synthesizern für Musik
  626. entwickelt. Um der Gefahr von Brummschleifen zu entgehen, sind
  627. MIDI-Geräte immer galvanisch (also über Optokoppler) voneinander
  628. getrennt. Als MIDI-Kabel eignen sich gewöhnliche Stereo-Überspiel-
  629. kabel. Mit Mono-Kabeln gibt es normalerweise Probleme, da im ATARI
  630. die (normalerweise) freien PINs der MIDI-Buchsen teilweise belegt
  631. sind! Spezielle sogenannte "MIDI-Kabel", wie sie oft in Musik-
  632. geschäften angeboten werden, sind zwar auch geeignet, aber
  633. bedeutend teuerer und keinesfalls besser als Stereo-Überspielkabel.
  634.  
  635.  
  636. 8.) Monitor/Source-Level-Debugger (MON51.TTP)
  637. =============================================
  638.  
  639. Um Fehler in Programmen zu suchen, dient diese Programm.
  640. Ein übergebens Programm wird an MIDI8031 gesendet, danach
  641. wird ein Bildschirm aufgebaut, der die wichtigsten Register
  642. anzeigt, sowie Teile des Programmes. 
  643.  
  644. Die Fähigkeiten von MON51:
  645. - bis zu 10 Breakpoints
  646. - Single-Step-Betrieb
  647. - ständige Anzeige wichtiger Register und Flags
  648. - Anzeigen des internen und externen RAMs von MIDI8031
  649. - Disassembler
  650. - Source-Level-Debugger
  651.  
  652. MON51 wird durch die SHELL51 gestartet. Übergibt die Shell an MON51
  653. eine Source-Level-Debugger-Datei (Extender 'M51'), so integriert 
  654. MON51 diese folgendermassen:
  655.  
  656. Cursortasten Hoch/Runter: Scrollen im Sourcetext, 1 Zeile. Mit 'Shift' 
  657.      jeweils 10, mit 'Control' 50 Zeilen.
  658.      Im Sourcetext können sie Teile mit der Assemblerdirektive
  659.      .hide verstecken! Scrollen ist nur im Sourcetext möglich, nicht
  660.      aber bei disassemblierten Programmteilen.
  661.  
  662. PC befindet sich an einer Stelle, zu der Sourcecode vorliegt:
  663.      Sourcecode wird angezeigt.
  664.  
  665. PC befindet sich an einer Stelle im RAM, zu der kein Sourcecode
  666.      vorliegt: RAM wird disassembliert.
  667.  
  668. PC befindet sich im EPROM (etwa bei Programmfehlern): Nichts wird
  669.      angezeigt, ausser die Adresse des PCs.
  670.  
  671. Bei Berechnungen: Mit dem Sourcecode übergibt die Shell an MON51 auch
  672.      eine Symbolliste, so dass die Symbolnamen verwendet werden
  673.      können.
  674.  
  675. Befehle des Monitors
  676. --------------------
  677.  
  678. - 'g' ohne Zusätze: Das Programm wird an der Stelle fortgesetzt, auf
  679.   den der PC zeigt. Das Programm kann per Tastendruck unterbrochen
  680.   werden, oder wenn es auf einen Breakpoint trifft.
  681. - 'g + Zahlenwert': Programm starten ab Zahlenwert. Bsp.:
  682.           g schleife+$16
  683.  
  684. - Die wichtigste Taste ist wohl 'Undo': Sie enthält 'g <NL>'.
  685.  
  686. - 's+': Single-Step-Ein: Pro 'g' wird nun nur ein Schritt ausgeführt.
  687. - 's-': Single-Step-Aus
  688.  
  689. - 'b': Liste der Breakpoints anzeigen
  690. - 'b-': Alle Breakpoints aufheben
  691. - 'b0-' bis 'b9-': Einzelnen Breakpoint aufheben
  692. - 'b0 = Zahlenwert' bis 'b9 = Zahlenwert': Setzen eines Breakpoints
  693.   (Beachten Sie dazu die Hinweise am Ende des Kapitels)
  694. - 'd': Erneuter Download: Oft ist es wünschenswert das gleiche
  695.   Programm nocheinmal zu starten. Dazu dient 'd'. Vor 'd' kann
  696.   MIDI8031 evtl. mit der Reset-Taste neu gestartet werden, falls
  697.   nötig.
  698.  
  699. - '?' Dient zur Berechnung von Ausdrücken Bsp.:
  700.           ? $8000+(schleife+nr)*3
  701.   Ausgabe als Dezimal- und Hexadezimal-Zahl.
  702.  
  703. - 'x Zahlenwert': Zeigt externes RAM des MIDI8031 an, Bsp.:
  704.       x $8000
  705.  
  706. - 'r Zahlenwert': Zeigt internes RAM des MIDI8031 an, maximal-
  707.   Adresse ist 127! Bsp.:
  708.      r 120   
  709.  
  710. - 'q': Verlässt MON51, MIDI8031 bleibt angehalten, wird aber
  711.   nicht resettet (das können sie ja bei Bedarf manuell am MIDI8031
  712.   machen).
  713.  
  714. Troubleshooting
  715. ---------------
  716.  
  717. MON51 unterstützt keinen selbstmodifitzierenden Code. Ausserdem
  718. benötigt er etwa 10 Bytes auf dem Stack des MIDI8031. Treten
  719. beim Debuggen wiederholt unerklärliche Zustände auf, so liegt das
  720. oft an falsch gesetztem (oder garnicht gesetztem) Stack des MIDI8031.
  721.  
  722. Ein weiteres "Problemchen" liegt an dem geringen MIDI-Buffer des
  723. ATARI: Gelegentlich kann es vorkommen, dass dieser überläuft,
  724. z. Bsp. bei sehr schnellem Single-Steppen: Plötzlich werden
  725. 'seltsame' Registerinhalte angezeigt, Adressen die es nicht gibt...
  726. Abhilfe: Einfach noch einen Step mehr machen: Der PC des MIDI8031 wird
  727. von diesem selbst verwaltet und nur bei Bedarf verändert etwa bei 
  728. explizitem Go (Bsp 'g $8000').
  729.  
  730. Interrupts: Jedesmal wenn MON51 sich meldet (Breakpoints, Singlestep)
  731. werden die Interrupts des 8031 disabled. Bei der Verwendung von
  732. Interrupts sollten sie also die Interruptroutine vielleicht zuerst
  733. als 'normales' Unterprogramm austesten, und erst dann auf einen
  734. Interrupt legen.
  735.  
  736. Breakpoints: Breakpoints auf MIDI8031 werden dadurch erzeugt, dass
  737. MON51 an die Stelle des Breakpoints eine (im Moment 7 Bytes lange)
  738. Routine schreibt. Nun kann folgendes Problem auftreten: Angenommen
  739. sei folgender Sourcetext:
  740.  
  741.  test:    ret
  742.  nixgut:  inc R0
  743.           ret
  744.  
  745. Wenn Sie nun einen Breakpoint an die Stelle 'test' setzen, wird auch
  746. das Unterprogramm 'nixgut' überschrieben, was zu seltsamen Effekten
  747. führen würde... Also, behalten Sie diese Tatsache im Hinterkopf und
  748. setzen Sie nie Breakpoints zu nahe vor derartigen Sprungbefehlen.
  749.  
  750. Trotz alledem glaube ich, dass MON51 ein sehr gutes Hilfsmittel bei
  751. der Softwareentwicklung für MIDI8031 ist.
  752.  
  753.  
  754. 9.) Interrupts des MIDI8031
  755. ===========================
  756.  
  757. Der 8031 springt bei Auftreten eines Interrupts immer auf eine
  758. fest vorgegebene Adresse:
  759.  
  760. $0003   Externer Interrupt 0 (Pin -INT0)
  761. $000B   Timer 0 Interrupt
  762. $0013   Externer Interrupt 1 (Pin -INT1)
  763. $001B   Timer 1 Interrupt
  764. $0023   Serieller Interrupt (Senden und Empfangen)
  765.  
  766. Im Entwicklungssystem MIDI8031 liegen diese Adressen im EPROM,
  767. ausserdem stehen für die einzelnen Interruptroutinen so nur je
  768. 8 Bytes zur Verfügung. Daher befindet sich an dieser Stelle im
  769. Enntwicklungssystem-EPROM folgender Code:
  770.  
  771. $0000:     reset:     ljmp ...          ; Systeminitialisierung
  772. $0003:     int0:      ljmp $8003
  773.                       .ds.b 5
  774. $000B:     timer0:    ljmp $800b
  775.                       .ds.b 5
  776. $0013:     int1:      ljmp $8013
  777.                       .ds.b 5
  778. $001B:     timer1:    ljmp $801b
  779.                       .ds.b 5
  780. $0023:     serial:    jnb PSW.5,?ose     ; F0=0: MIDI abfangen 
  781.                       ljmp $8023         ; F1=1: USER-MIDI
  782.            ?ose:      ajmp ...
  783.  
  784. Bei Auftreten eines Interrupts springt der 8031 also zur
  785. entsprechenden Adresse im RAM! Verwendet werden Interrupts
  786. z. Bsp. im Schrittmotorprogramm oder im Sprachsynthesizer.
  787. Eine Besonderheit stellt der serielle Interrupt dar: Normaler-
  788. weise dient er ja zur Steuerung des Entwicklungssystems. Wollen
  789. sie jedoch den seriellen Interrupt für eigene Programme verwenden,
  790. müssen sie das Prozessorflag F0 setzen, was natürlich auch heisst,
  791. dass dieses Flag anderweitig nicht verwendet werden darf!
  792.  
  793. Verwendet Ihr Programm Interrupts, und läuft es im RAM korrekt,
  794. und beginnt es normalerweise an Adresse $8000, können Sie es ohne 
  795. Probleme in ein EPROM brennen, indem Sie einfach die Anfangsadresse
  796. in $0 ändern und mit diesem Sourcecode eine O51-Datei erzeugen,
  797. mehr dazu später...
  798.  
  799. Allerdings laufen die Interrupts im EPROM etwas schneller ab, da
  800. ja nun jeweils ein Sprungbefehl fehlt!
  801.  
  802.  
  803. 10.) Tips zur Fehlersuche
  804. =========================
  805.  
  806. Über dieses Thema liesse sich natürlich sehr viel sagen. Oft aber
  807. liegen Fehler an so elementaren Dingen, dass man fast nicht drauf-
  808. kommt:
  809.  
  810. -  Initialisierung von Interrupts: Interrupts werden durch
  811.    3 Bits initialisiert: 1.) Das Enable-Bit des Interrupts im
  812.    IE-Spezialfunktionsregister, 2.) Das Prioritäts-Bit des
  813.    Interrupts im IP-Register, 3.) Das Generelle Interrupt-Enable-
  814.    Bit EA, es ist das oberste Bit im Register IE (also IE.7).
  815.    Speziell zu bei Timern gibt es auch noch das Zusammenspiel
  816.    zwischen Timer-Overflow-Flag (TF0/1) und Timer-Run-Flag (TR0/1): 
  817.    Immer wenn ein Timer dir Grenze 255->0 Überschreitet wird sein
  818.    Overflow-Flag (TF0/1) gesetzt. TF0/1 wird bei Ausführung eines
  819.    Interrupts automatisch rückgesetzt. Bevor sie Timer-Interrupts
  820.    verwenden, sollten sie zusätzlich diese Sequenz in Ihrer Software
  821.    einbauen: 1.) Timer Interrupt disablen, 2.) TR-Bit löschen, 3.) 
  822.    TF-Bit rücksetzen ( = auf 0).
  823.  
  824. -  Stack: der Stack wächst nach oben! Vergessen Sie niemals ihn
  825.    zu initialisieren. Das Entwicklungssystem benötigt etwa
  826.    10 Bytes auf dem Stack.
  827.  
  828. -  Read-Modify-Write: Jedem Port ist noch ein Zwischenspeicher
  829.    vorgeschaltet, der den Ausgabepegel des Ports speichert.
  830.    Manche Befehle lesen nun den Wert des Port-Latches, andere
  831.    wiederum den wirklichen Pegel am Port. Insbesondere im
  832.    Zusammenhang mit Port 3 kann dies zu Problemen führen:
  833.    Der Befehl   mov A,P3  etwa liest den am Port aussen
  834.    anliegenden Pegel, indem einfach der Port auf LOW geschaltet
  835.    wird, und dann gemessen wird, ob ein Strom fliesst. Leider
  836.    hängen auch die Signale -RD und -WR an diesem Port. Durch
  837.    den Lesebefehl ist deshalb das RAM der Meinung, es soll
  838.    beschrieben werden, was sofort zum Absturz von MIDI8031 führt!
  839.    Dagegen ist das Lesen des Portlatches völlig ungefährlich.
  840.    Zu diesem Thema finden Sie Informationen unter dem Stichwort:
  841.    Read-Modify-Write-Befehle in jedem Buch zum Thema 51-er 
  842.    Controller.
  843.    
  844.  
  845. 11.) Die Demoprogramme
  846. ======================
  847.  
  848. A
  849. -
  850.  
  851. Dieses Minimalprogramm bringt die LED von MIDI8031 zum
  852. Blinken
  853.  
  854. MORSE
  855. -----
  856.  
  857. Dieses Programm gibt einen Text als Morsezeichen aus, indem
  858. es mit der LED blinkt, und auch Töne am Pin P1.0 ausgibt.
  859. Ausserdem zeigt es auch, wie Portpins abgefragt werden können:
  860. Wenn Sie zwischen Pin P3.3 und GND (Buchsenleiste Pin 15 und 20)
  861. eine Taste anschliessen, können sie durch Drücken der Taste die 
  862. Tonhöhe des Morsesignals verstellen. Der Lautsprecher wird zwischen 
  863. Pin 2 und 3 der Buchsenleiste angeschlossen. Der Port kann im LOW-
  864. Zustand pro Pin nur wenige Miliampere ziehen. Daher muss dem Laut-
  865. sprecher ein Wiederstand vorgeschaltet werden. Je nach Wiederstand 
  866. des Lautsprechers sollte der Gesamtwiederstand mindestens 200 Ohm 
  867. betragen, um Schäden am Port des MIDI8031 zu vermeiden. Leider
  868. bleibt aufgrund des Vorwiederstandes nicht mehr viel Leistung für
  869. den Lautsprecher übrig, wenn seine Impendanz klein ist (4-8 Ohm).
  870. Empfehlenswerter sind hier sogenannte 'Mittelohmige Lautsprecher',
  871. deren Impendanz etwa 40-45 Ohm beträgt. Als besonders geeignet 
  872. für Tonausgabe hat sich die Schaltung bewährt, wie sie im Text 
  873. des Programmes PHONEM.S51 beschrieben ist, wie noch folgt.
  874.  
  875. SCHRITT
  876. -------
  877.  
  878. Dieses Programm dient zur gleichzeitigen Ansteuerung zweier
  879. Schrittmotoren. Prinzipiell soll es eigentlich mur zeigen,
  880. wie problemlos sich auch Interrupts in eigenen Programmen
  881. verwenden lassen. Die Schrittmotoren werden über Port P1 gesteuert. 
  882. Es können nur sogenannte 4-Strang-Motoren verwendet werden, die aber 
  883. auch am verbreitetsten sind. Dazu wird die spezielle MIDI8031-
  884. Hardware-Erweiterung MIDI8031-Powerport verwendet, die im 3. Teil 
  885. der Serie beschrieben worden ist. MIDI8031-Powerport ist aber 
  886. bedeutend mehr als nur eine einfache Schrittmotorkarte: Auf der 
  887. Platine befinden sich 8 preiswerte SIPMOS-Leistungs-MOSFET-
  888. Transistoren, von denen jeder(!) maximal 20 Ampere ziehen kann 
  889. (Summe also 160 Ampere!). Dabei kann die Taktrate bis zu 500 kHz 
  890. betragen. Prinzipiell können sie an den MIDI8031-Powerport alles
  891. anschliessen, das sich mit maximal 30 Volt und 20 Ampere betreiben
  892. lässt: Kleinbohrmaschinen, Lötkolben, Halogenlampen, Relais, ...
  893. Die Bauanleitung zu dieser Karte finden sie, wie bereits erwähnt 
  894. im 3. Teil der Serie.
  895.  
  896. Zu SCHRITT gehört auch die Datei SCHRITT.TXT: Ein GFA-Basic-Programm:
  897. Starten sie SCHRITT von der Schell aus und verlassen sie dann die
  898. Shell. Starten sie nun GFA-Basic und laden Sie mit MERGE SCHRITT.TXT.
  899. SCHRITT.TXT gibt für jeden Motor ein individuelles Fahrprogramm aus
  900. und zeichnet es auf dem Bildschirm.
  901.  
  902. CODE
  903. ----
  904.  
  905. Ein Software-Rauschgenerator.
  906.  
  907. OS
  908. --
  909.  
  910. Das ist der Sourcecode des Entwicklungssystem-EPROMS
  911.  
  912. PHONEM
  913. ------
  914.  
  915. Das wohl interessanteste Demo-Programm überhaupt: Ein Sprach-
  916. synthesizer mit linearem 7-Bit-Pulswandler. Mithilfe 
  917. von SMSEDIT.PRG, einem Programm zur digitalen Signalverarbeitung, 
  918. das im nächsten Kapitel beschrieben wird, können aus gesampelten 
  919. Sprachsignalen Dateien erzeugt werden, mit denen PHONEM gesteuert 
  920. wird. In ein 32KB-EPROM passen  ohne Aufwand bis zu 1 Minute Sprache 
  921. in guter Qualität.  Einige fertige Text befinden sich bereits mit 
  922. im Paket, sie müssen nur noch den jeweiligen Namen der Datei im 
  923. Sourcecode zu PHONEM einsetzen.
  924.  
  925. PHONEM ist in der vorliegenden Fassung nur ein Fragment: ver-
  926. bessert man die Datenverwaltung noch etwas, lassen sich der
  927. Speicherverbrauch ohne Qualitätseinbusen auf etwa 1/5 senken!
  928. Geht man noch weiter, lassen sich aus den Daten die Grundbausteine
  929. menschlicher Sprache, die sogenannten Phoneme isolieren. Dann
  930. allerdings sinkt die Qualität etwas ab, aber der Speicherverbrauch l
  931. iegt bei weniger als 50 Bytes pro Sekunde Sprache! In jedem Fall
  932. bleibt die Sprache noch ziemlich gut verständlich.
  933.  
  934. Wollen Sie PHONEM in ein EPROM brennen, beachten Sie bitte die
  935. Hinweise im Kapitel Interrupts: Das Timing von PHONEM ist auf
  936. den Zyklus genau berechnet. In der EPROM-Version müssen daher
  937. 3 zusätzliche Zyklen in die Timer0-Interruptroutine eingebaut 
  938. werden (Z. Bsp. 3 mal NOP).
  939.  
  940. Die Arbeitsweise von PHONEM: Aus dem gesprochenen und gesampelten
  941. Text isoliert SMSSEDIT die wesentlichen Merkmale der Sprache:
  942. Jede Sekunde Sprache wird in etwa 60 Abschnitte zerlegt. Für
  943. jeden Abschnitt wird eine Hartley-Transformation durchgeführt
  944. (das ist eine der FFT verwandte Transformation). Aus dem 
  945. Leistungsdichte-Spektrum eines jeden Fensters werden die
  946. 12 wichtigsten Frequenzen entnommen, zusammen mit ihrer
  947. Amplitude. Die Synthese in PHONEM erfolgt nun derart, dass 
  948. die jeweiligen 6 Frequenzen mithilfe einer Tabelle einer
  949. Sinusschwingung wieder zusammmengesetzt werden. Leider kann
  950. der 8031 nur vorzeichenlose Zahlen miteinander multiplizieren.
  951. Daher ist zu jedem Datensatz noch ein Extrabyte zugefügt, das
  952. einen Offset angibt, der jeweils addiert wird.
  953.  
  954. Pro Sekunde synthetisiert MIDI8031 etwa 8000 Werte des Signals.
  955. Um das Signal hörbar zu machen, wird es als Pulsweite-Moduliertes
  956. Signal am Portpin P1.0 ausgegeben. Leider pfeift das Signal
  957. noch etwas. Leidliche Abhilfe schafft ein Tiefpass, wie im Source-
  958. text beschrieben. Besser noch wäre ein aktives Filter, was aber
  959. auch den Aufwand in die Höhe treiben würde.
  960.  
  961. Interessante Bilder ergeben sich, wenn man den Frequenzverlauf
  962. der einzelnen Komponenten zeichnet: SMSSEDIT sortiert die Daten
  963. nach Frequenz. Zeichnet man also den Verlauf der Frequenz-
  964. komponenten auf, deren Amplitude grösser als 1 ist, ergeben sich
  965. interessante Muster, die für jeden Menschen (der den gleichen
  966. Text spricht) in etwa gleich sind! Die meisten Spracherkennungs-
  967. programme arbeiten nach diesem System.
  968.  
  969.  
  970. 12.) Sprachsynthese mit SMSSEDIT
  971. ================================
  972.  
  973. Dieses Programm wurde ursprünglich für einen anderen Zweck
  974. geschrieben. Daher enthält es viele Funktionen, die hier
  975. nicht notwendig sind. Vorgehensweise:
  976.  
  977. Mit 'l' (Bereich laden) wird eine bereits gesampelte Datei
  978. eingeladen (eine, ZAHL1_10.PAT, befindet sich bereits auf Disk).
  979.  
  980. 'r': Falls sie einen Sampler zum Anschluss am Druckerport
  981. des STs besitzen, probieren sie einfach mal aus, ob er mit SMSSEDIT
  982. zusammenarbeitet: 'r'+ '<Taste>' startet die Aufnahme.
  983.  
  984. Mit 'p' wird der geladene Bereich abgespielt (Monitorlautsprecher
  985. dazu voll aufdrehen).
  986.  
  987. Mit 'b' können sie mit der Maus einen Ausschnitt des Bereichs zoomen,
  988. mit 'o' kommen sie wieder zurück.
  989.  
  990. mit 'i' wird eine Sprachanalyse des Bereichs durchgeführt und das
  991. synthetisierte Signal anstelle des Originals eingesetzt. Haben sie
  992. ihr MIDI8031 am ATARI angeschlossen, können sie auch das synthetische
  993. Signal dort ausgeben, indem sie vor 'i' das '~' drücken. Die Analyse
  994. ist enorm rechenaufwendig. Ich habe dazu die schnellsten derzeit
  995. bekannten Analysealgorithmen verwendet (selbstverständlich in
  996. 100% optimiertem Assembler). Wenn sie das synthetisierte Signal
  997. über MIDI8031 ausgegeben haben, empfiehlt es sich, es durch
  998. Druck der Reset-Taste zu beenden.
  999.  
  1000. '0' speichert die gewonnen Koeffizienten auf Disk ab (Format PHO)
  1001.  
  1002. '1' lädt eine PHO-Koeffizientendatei ein. Es befindet sich bereits
  1003. eine mit auf Disk.
  1004.  
  1005. '2' führt nur eine Synthese mit den bereits vorhandenen Koeffizienten
  1006. durch (Bsp.: erneute Augabe an MIDI8031)
  1007.  
  1008. '3' wählt einen anderen Analyse-Verstärkungsfaktor
  1009.  
  1010. '4' speichert die Koeffizienten im Format P51 ab, so dass sie mit
  1011. PHONEM verwendet werden können. Der Filestruktur ist folgendermassen:
  1012. - Jede Sekunde Sprache wird in ca. 60 Fenster zerlegt, von denen
  1013.   jedes durch 13 Bytes beschrieben wird.
  1014. - Die ersten 6 Bytes eines Fensters enthalten die 6 Frequenzen der
  1015.   Komponenten (0..127), danach kommen die 6 Lautstärken der 
  1016.   Komponenten,(0..255), zum Schluss noch ein Offset der das
  1017.   Synthesesignal auf Wandlermitte justiert.
  1018.  
  1019. Falls sie an einer genauen Anleitung zu SMSSEDIT interessiert sind:
  1020. SMSSEDIT ist Teil des SMS Synthesisers V1.10, den sie in jeder gut
  1021. sortierten Public-Domain-Sammlung finden. Auf der SMS-Diskette ist
  1022. auch eine detailierte Anleitung zu SMSSEDIT enthalten.
  1023.  
  1024.  
  1025. 13.) Zusatzhardware, MIDI8031-Powerport
  1026. =======================================
  1027.  
  1028. Die Menge der möglichen Hardware-Erweiterungen zu MIDI8031
  1029. ist völlig beliebig. MIDI8031-Powerport ist lediglich ein
  1030. eine Möglichkeit. Es sind nur einige Dinge zu beachten:
  1031.  
  1032. Die Ports des 80C31 enthalten stark vereinfacht:
  1033.  
  1034.    (+ 5 Volt) ---------------+
  1035.                              |
  1036.                    [ Pull-Up-Wdst etwa 20kOhm ]
  1037.                              |
  1038.                              +----------> Portpin                
  1039.                              |
  1040.                          | <--  FET, kann bis etwa 20 Mili-Ampere
  1041.             -  - - ------| <--  aufnehmen, mehr ist gefährlich
  1042.                              |
  1043.                            -----  
  1044.                             ---  GND
  1045.                              -
  1046.  
  1047. - Nach Reset befinden sich Portpins immer auf High.
  1048.  
  1049. - Eingabegeräte: Taster, Schalter, ... werden immer zwischen
  1050.   dem Portpin des 80C31 und GND angeschlossen. Aus Schutzgründen
  1051.   können sie dem Taste, Schalte, ..., einen 150 Ohm Wiederstand
  1052.   vorschalten (Struktur des Portes ist in Wirklichkeit komplizierter,
  1053.   auch zwischen +5V und dem Pin liegt noch ein zweiter FET, der aber 
  1054.   nur für wenige Mikrosekunden bei Schreibzugriffen auf den Portpin
  1055.   durchschaltet).
  1056.  
  1057. - Ausgabe: Im LOW-Zustand ist der FET durchgeschaltet. Trotzdem
  1058.   ist die Verwendung von Puffern (wie etwa im MIDI8031-Powerport,
  1059.   wie in ST-Computer 7/92 beschrieben) zum Schutz des 80C31 zu 
  1060.   empfehlen.
  1061.  
  1062.  
  1063. 14.) Stromsparmechanismen des 80C31
  1064. ===================================
  1065.  
  1066. Die CMOS-Mikrocontrollertypen der 51er-Familie, wie auch der 80C31, 
  1067. besitzen 2 softwaermässige Mechanismen zur Reduzierung der Leistungs-
  1068. aufnahme des Mikrocontrollers. Die beiden Zustände sind als
  1069. 'IDLE-Mode' und als 'POWER-DOWN-Mode' bezeichnet. Zur Aktivierung
  1070. der Moden gibt es das SF-Register 'PCON'. Das Register PCON ist
  1071. nicht bitadressierbar!
  1072.  
  1073. IDLE-Mode
  1074. ---------
  1075.  
  1076. Durch Setzen des Bits PCON.0 lässt sich der IDLE-Mode setzen.
  1077. Im IDLE-Mode bleibt der Prozessor stehen, hält aber die 
  1078. Zustände der Ports. Bei Auftreten eines nicht gesperrten 
  1079. Interrupts (Intern oder Extern) wird der IDLE-Mode wieder 
  1080. aufgehoben und der entsprechende Interrupt ausgeführt.
  1081. Der IDLE-Mode kann durch folgenden Befehl aktiviert werden:
  1082. orl PCON,#%1. Sind alle Ports auf High, und die LED aus,
  1083. verbraucht MIDI8031 nur noch etwa 6 Miliampere, von denen
  1084. etwa 3 Miliampere auf den 80C31 entfallen, der Rest auf die
  1085. übrigen ICs, vor allem Optokoppler und Spannungsregler.
  1086.  
  1087. POWER-DOWN-Mode
  1088. ---------------
  1089.  
  1090. Durch Setzen des Bits PCON.1 gelangt der 80C31 in den
  1091. POWER-DOWN-Mode. In diesem Modus ist der Prozessor
  1092. praktisch eingefroren. Der Zustand kann nur durch einen
  1093. Reset beendet werden! Im POWER-DOWN-Mode verbraucht
  1094. der Prozessor 80C31 nur noch etwa 10 Mikroampere bei
  1095. einer Versorgungs-Spannung von 2 Volt. Dabei ist der
  1096. Erhalt der Daten im internern RAM garantiert, sofern
  1097. der POWER-DOWN-Mode vor Absinken der Versorgunsspannung
  1098. unter 4.5 Volt aktiviert worden ist. Die Zustände der Ports
  1099. bleiben ebenfalls erhalten. Da der 80C31 auch im POWER-DOWN-
  1100. Mode bei einer Versorgungsspannung von 5 Volt etwa 1 Mili-
  1101. Ampere verbraucht, ist dieser Modus für MIDI8031 eigentlich
  1102. ungeeignet, da er wie gesagt nur durch Reset beendet werden
  1103. kann. Für Batteriebetriebene Eigenentwicklungen kann
  1104. folgendes Schema verwendet werden:
  1105.  
  1106. - Bei Absinken der Versorgungsspannung unter eine bestimmte
  1107.   Schwelle wird ein Interrupt ausgelöst.
  1108. - Der Interrupt sichert relevante Daten im internen RAM, 
  1109.   setzt möglichst alle Portbits auf 1 und aktiviert den 
  1110.   POWER-DOWN-Mode.
  1111. - Über eine Schaltung mit einer Schottky-Diode wird nur der
  1112.   Prozessor Ruhestromversorgt:
  1113.  
  1114.           Schottky-Diode  
  1115. +5Volt        !\ !     +4.8Volt
  1116. o-------------! >!----------------------+
  1117. +Allgemein    !/ !                      !
  1118.                                         !
  1119.                                         !
  1120. Batterie                                !
  1121. o--------------------------[ Wdst. ]----+------->
  1122. +U-Bat                                  !  zum Pin1
  1123.                                         !   80C31
  1124.                                Kond.  -----
  1125.                                100nF  -----
  1126.                                         !
  1127.                                         !                                          
  1128.                                         !
  1129.                                        --- Gnd
  1130.                                         -
  1131.  
  1132. Der Wiederstand wird so bemessen, dass im POWER-DOWN-Mode
  1133. auch bei schwächerer Batterie eine Spannung von mindestens 2 
  1134. Volt am Pin1 anliegt.
  1135.  
  1136.  
  1137. 15.) Fileformate
  1138. ===============
  1139.  
  1140. Assembler:
  1141.   Das Format ist total primitiv (Format O51):
  1142.   zuerst kommen die Codebytes. Die letzten 2 Bytes einer O51-Datei
  1143.   geben die Startadresse an (also zwischen $8000 und $FFFF bei
  1144.   wenn das Programm in's RAM des MIDI8031 soll)
  1145.  
  1146. SMSSEDIT, PHO:
  1147.   Zu jeweils 128 Bytes des Samples werden die 6 wichtigsten
  1148.   Frequenzanteile bestimmt und als Worte abgespeichert:
  1149.      6 * ( Frequenz.w, Amplitude.w )
  1150.   Am Ende der Datei folgt 4 * -1L 
  1151.   Die Frequenz bezieht sich immer auf eine 256-Schritte lange
  1152.   Sinusschwingung, d.h. der Frequenz '256' würde die
  1153.   Tonfrequenz 7980 Hertz entsprechen, der Frequenz '1' die
  1154.   Tonfrequenz 7980/256 Hertz. Die Amplitude liegt normalerweise 
  1155.   immer im Bereich von 0..127.
  1156.  
  1157.  
  1158. 16.) Programme ins EPROM brennen, das OS-EPROM, EPROM-Service
  1159. =============================================================
  1160.  
  1161. Leider vergisst MIDI8031 alles, wenn ihm der Strom fehlt.
  1162. Ich habe weiter oben bereits erwähnt, dass Besteller des MIDI8031-
  1163. Bausatzes einen besonderen Service in Anspruch nehmen können:
  1164.  
  1165. * Ich brenne EPROMs für Besteller des MIDI8031-Bausatzes zum
  1166. * Selbstkostenpreis.
  1167.  
  1168. Dadurch sparen sie sich die Anschaffung eines teuren EPROM-Brenners
  1169. und sie können die erprobte MIDI8031-Hardware für ihr eigenes
  1170. Programm benutzen.
  1171.  
  1172. EPROM-Dateien, OS-EPROM
  1173. -----------------------
  1174.  
  1175. Um ein 8051-Programm in ein EPROM zu brennen, genügt es, wenn
  1176. sie im Sourcetext die Zieladresse mit .text_org $0 angeben.
  1177. Falls ihr Programm Interrupts verwendet, stellen sie sicher,
  1178. dass Interrupts wie im gleichnamigen Kapitel initialisiert worden
  1179. sind.
  1180. Der Assembler kann auch direkt aufgerσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσs Programm wurde ursprünglich für einen anderen Zweck
  1181. geschrieben. Daher enthält es viele Funktionen, die hier
  1182. nicht notwendig sind. Vorgehensweise:
  1183.  
  1184. Mit 'l' (Bereich laden) wird eine bereits gesampelte Datei
  1185. eingeladen (eine, ZAHL1_10.PAT, befindet sich bereits auf Disk).
  1186.  
  1187. 'r': Falls sie einen Sampler zum Anschluss am Druckerport
  1188. des STs besitzen, probieren sie einfach mal aus, ob er mit SMSSEDIT
  1189. zusammenarbeitet: 'r'+ '<Taste>' startet die Aufnahme.
  1190.  
  1191. Mit 'p' wird der geladene Bereich abgespielt (Monitorlautsprecher
  1192. dazu voll aufdrehen).
  1193.  
  1194. Mit 'b' können sie mit der Maus einen Ausschnitt des Bereichs zoomen,
  1195. mit 'o' kommen sie wieder zurück.
  1196.  
  1197. mit 'i' wird eine Sprachanalyse des Bereichs durchgeführt und das
  1198. synthetisierte Signal anstelle des Originals eingesetzt. Haben sie
  1199. ihr MIDI8031 am ATARI angeschlossen, können sie auch das synthetische
  1200. Signal dort ausgeben, indem sie vor 'i' das '~' drücken. Die Analyse
  1201. ist enorm rechenaufwendig. Ich habe dazu die schnellsten derzeit
  1202. bekannten Analysealgorithmen verwendet (selbstverständlich in
  1203. 100% optimiertem Assembler). Wenn sie das synthetisierte Signal
  1204. über MIDI8031 ausgegeben haben, empfiehlt es sich, es durch
  1205. Druck der Reset-Taste zu beenden.
  1206.  
  1207. '0' speichert die gewonnen Koeffizienten auf Disk ab (Format PHO)
  1208.  
  1209. '1' lädt eine PHO-Koeffizientendatei ein. Es befindet sich bereits
  1210. eine mit auf Disk.
  1211.  
  1212. '2' führt nur eine Synthese mit den bereits vorhandenen Koeffizienten
  1213. durch (Bsp.: erneute Augabe an MIDI8031)
  1214.  
  1215. '3' wählt einen anderen Analyse-Verstärkungsfaktor
  1216.  
  1217. '4' speichert die Koeffizienten im Format P51 ab, so dass sie mit
  1218. PHONEM verwendet werden können. Der Filestruktur ist folgendermassen:
  1219. - Jede Sekunde Sprache wird in ca. 60 Fenster zerlegt, von denen
  1220.   jedes durch 13 Bytes beschrieben wird.
  1221. - Die ersten 6 Bytes eines Fensters enthalten die 6 Frequenzen der
  1222.   Komponenten (0..127), danach kommen die 6 Lautstärken der 
  1223.   Komponenten,(0..255), zum Schluss noch ein Offset der das
  1224.   Synthesesignal auf Wandlermitte justiert.
  1225.  
  1226. Falls sie an einer genauen Anleitung zu SMSSEDIT interessiert sind:
  1227. SMSSEDIT ist Teil des SMS Synthesisers V1.10, den sie in jeder gut
  1228. sortierten Public-Domain-Sammlung finden. Auf der SMS-Diskette ist
  1229. auch eine detailierte Anleitung zu SMSSEDIT enthalten.
  1230.  
  1231.  
  1232. 13.) Zusatzhardware, MIDI8031-Powerport
  1233. =======================================
  1234.  
  1235. Die Menge der möglichen Hardware-Erweiterungen zu MIDI8031
  1236. ist völlig beliebig. MIDI8031-Powerport ist lediglich ein
  1237. eine Möglichkeit. Es sind nur einige Dinge zu beachten:
  1238.  
  1239. Die Ports des 80C31 enthalten stark v